/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package daos;

import entidades.Cliente;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import negocio.NegocioDAO;
import negocio.NegocioException;
import seguranca.Interfaces.ICliente;

/**
 *
 * @author renan
 */
public class ClienteDao extends NegocioDAO implements ICliente {

    private Cliente cliente;

    public ClienteDao() {
        cliente = new Cliente();
        limpar();
    }

    public void inserirCliente() throws NegocioException {
        if (buscaLogin()) {
            throw new NegocioException("Login já existente");
        }
        validar();
        EntityManager persistencia = NegocioDAO.getInstance().getEntityManager();
        persistencia.persist(cliente);
        persistencia.getTransaction().commit();
        persistencia.close();
    }

    public boolean buscaLogin() {
        List<Cliente> colecao = getList(Cliente.class,
                "SELECT c FROM Cliente c WHERE c.login = :login", cliente.getLogin());
        if (colecao.isEmpty()) {
            return false;
        }

        return true;
    }

    public void validar() throws NegocioException {
        erros.limpar();


        if (estaVazio(cliente.getNome())) {
            erros.campoObrigatorio("nome");
        }

        if (estaVazio(cliente.getTelefone())) {
            erros.campoObrigatorio("telefone");
        }

        if (estaVazio(cliente.getCpf())) {
            erros.campoObrigatorio("cpf");
        }

        if(!valida_CpfCnpj(cliente.getCpf())){
            erros.campoInvalido("cpf");
        }

        if (estaVazio(cliente.getLogin())) {
            erros.campoObrigatorio("login");
        }

        if (estaVazio(cliente.getSenha())) {
            erros.campoObrigatorio("senha");
        }

        if (estaVazio(cliente.getEmail())) {
            erros.campoObrigatorio("email");
        }

        if (!validaEmail(cliente.getEmail())) {
            erros.campoInvalido("email");
        }

        if (erros.existe()) {
            throw new NegocioException(erros);
        }
    }

    

    public void limpar() {
        cliente.setId("");
        cliente.setCpf("");
        cliente.setLogin("");
        cliente.setNome("");
        cliente.setSenha("");
        cliente.setTelefone("");
        cliente.setCelular("");
        cliente.setEmail("");
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> List<T> getList(Class<T> classToCast, String jpql, Object... parameters) {
        List<T> toReturn = null;
        EntityManager em = getEntityManager();
        Query qr = em.createQuery(jpql);
        qr.setParameter("login", parameters[0]);
        toReturn = qr.getResultList();
        em.getTransaction().commit();
        em.close();
        return toReturn;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /* tem q fazer esses cara =)*/
    public void alterarCliente() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deletar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
